import csv
from pyecharts.charts import Bar, Timeline
from pyecharts.options import TitleOpts, TooltipOpts, LegendOpts, LabelOpts, AxisOpts
from pyecharts.globals import ThemeType

# 初始化一个空字典来存储数据
gdp_data = {}

# 使用 open() 打开文件，尝试使用 GB2312 编码
f = open(r'data\1960-2019全球GDP数据.csv', 'r', encoding='GB2312')

# 读取CSV文件的内容
reader = csv.reader(f)
header = next(reader)  # 第一行是列名（年份和各个国家的名称）

# 逐行读取数据
for row in reader:
    year = row[0]  # 年份
    country = row[1]  # 国家
    gdp_value = row[2]  # GDP值

    # 处理 GDP 值的科学计数法格式（如 "5.433E+11")
    try:
        gdp_value = float(gdp_value)  # 将GDP值转换为浮点数
    except ValueError:
        gdp_value = 0.0  # 如果转换失败，设置为0

    # 将数据按年份存储
    if year not in gdp_data:
        gdp_data[year] = []
    gdp_data[year].append([country, gdp_value])

# 关闭文件
f.close()

# 创建Pyecharts的Timeline实例
timeline = Timeline()

# 为每个年份创建一个Bar图，并将其加入Timeline
for year in sorted(gdp_data.keys()):
    # 获取每个年份的国家和GDP值，并按GDP值降序排序取前8名
    sorted_data = sorted(gdp_data[year], key=lambda x: x[1], reverse=True)[:8]
    countries_top8 = [item[0] for item in sorted_data]  # 国家（前8位）
    gdp_values_top8 = [item[1] for item in sorted_data]  # 对应的GDP值

    # 创建柱状图
    bar = Bar()
    bar.add_xaxis(countries_top8)  # X轴是国家（前8位）
    bar.add_yaxis(f"{year}", gdp_values_top8)  # Y轴是GDP值

    # 反转x和y轴，使得GDP值从大到小显示
    bar.reversal_axis()
    # 设置标题、提示框、图例等选项
    bar.set_global_opts(
        title_opts=TitleOpts(title="1960-2019 全球各国GDP前8", subtitle=f"年份: {year}"),
        tooltip_opts=TooltipOpts(trigger="axis", axis_pointer_type="shadow"),
        legend_opts=LegendOpts(type_="scroll", pos_left="center"),
        xaxis_opts=AxisOpts(name="GDP（单位：美元）"),
        yaxis_opts=AxisOpts(name="国家", is_inverse=True),  # Y轴反转，长的在上面
    )

    # 设置标签位置为右侧
    bar.set_series_opts(
        label_opts=LabelOpts(position='right')  # 设置标签显示在柱子右侧
    )

    # 将当前的Bar图添加到Timeline
    timeline.add(bar, f"{year}")

# 播放设置
timeline.add_schema(
    is_auto_play=True,
    is_loop_play=True,
    is_timeline_show=True,
    play_interval=500
)

# 渲染为HTML文件
timeline.render('1960-2019 全球各国GDP前8.html')